package com.hk.service.order;

import com.hk.commons.HqlFilter;
import com.hk.commons.entity.OrganizationFiled;
import com.hk.commons.entity.UserChannel;
import com.hk.commons.entity.order.OrderInfo;
import com.hk.commons.entity.sys.SysUser;
import com.hk.commons.vo.CheckInfo;
import com.hk.commons.vo.OrderExcelRes;
import com.hk.commons.vo.OrderStrMsg;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.List;

public interface IOrderInfo {
	public OrderInfo findById(long id);

	/**
	 * 保存
	 * 
	 * @param
	 * @return
	 */
	public Long add(OrderInfo u);

	/**
	 * 删除
	 * 
	 * @param
	 * @return
	 */
	public void delete(OrderInfo u);
	
	/**
	 * 判断某一个用户是否能够购买某一款产品
	 * @return
	 */
	
	public Boolean check(Long userId, Long productId);
	/**
	 * 更新
	 * 
	 * @param
	 */
	public void update(OrderInfo u);

	public List<OrderInfo> findByFilter(HqlFilter hqlFilter, int pageNum,
			int pageSize);

	public List<OrderInfo> findByFilter(HqlFilter hqlFilter);

	public Long countByFilter(HqlFilter hqlFilter);

	/**
	 * 产品开始计息
	 * 
	 * @param productId
	 * @return
	 */
	public Boolean startDiv(Long productId, Timestamp tradeTime,
			Timestamp divEndTime);
	
	
	/**
	 * 产品开始回款
	 * @param productId
	 * @return
	 */
	public Boolean startPayBack(Long productId);

	/**
	 * 根据信息初始化订单
	 * 
	 * @param orderId
	 * @param userId
	 * @param productId
	 * @param amount
	 * @return
	 */
	public OrderInfo initOrder(Long orderId, Long userId, Long productId,
			Long userCardId, BigDecimal amount);

	/**
	 * 将需要划拨的信息存入redis中
	 * @param orderId
	 * @param outAccount
	 * @param inAccount
	 * @param amt
	 */
	public void addTransferOrderIntoRedis(Long orderId, String contractNo, String outAccount, String inAccount, BigDecimal amt);
		
 
	/**
	 * 将待回款的订单放入redis中
	 * @param orderId
	 * @param outAccount
	 * @param inAccount
	 * @param amt
	 */
	public void addPaybackOrderIntoRedis(Long orderId, String outAccount, String inAccount, BigDecimal amt);
	
	/**
	 * 从redis 中获取订单信息
	 * 
	 * @param key
	 * @return
	 */
	public OrderInfo getOrderFromRedis(String key);

	/**
	 * 从redis 中删除订单信息
	 * 
	 * @param key
	 * @return
	 */
	public void delOrderFromRedis(String key);

	/**
	 * 更改订单的状态
	 * 
	 * @param
	 * @param payStatus
	 * @param confirmStatus
	 */
	public OrderInfo updateAndSaveOrder(OrderInfo orderInfo, Integer payStatus,
			Integer confirmStatus);

	public List<OrderInfo> findPayBackOrders(int confirmStatus, int payStatus,
			Long paymentId);

	/**
	 * 获取刚起标的订单信息
	 * 
	 * @return
	 */
	public List<OrderInfo> getProdNewStartOrders();
	
	/**
	 * 根据 userId 获取总的投资金额
	 * @param userId
	 * @return
	 */
	public BigDecimal getTotalPayAmt(Long userId);

	/**
	 * 根据id获取合同的url
	 * @param orderId
	 * @return
	 */
	public String getContractUrl(Long orderId);


	/**
	 * s更新合同的url
	 * @param orderId
	 * @param url
	 * @return
	 */
	public Boolean setContractUrl(Long orderId, String url, String contractTitle);


	/**
	 * s更新合同的url
	 * @param orderId
	 * @param url
	 * @return
	 */
	public Boolean setContractUrlHtml(Long orderId, String url);


	public BigDecimal getTotalPayAmt(Long userId, Long startTime);

    public OrderExcelRes getOrderExcelRes(OrderStrMsg orderStrMsg, Long userId);

    public OrderExcelRes getOrderExcelRes(OrderStrMsg orderStrMsg, Boolean isOpear, Boolean isChannelLeader, Boolean isTeamLeader);


	/**
	 * 修改推荐码
	 * @param finUser
	 * @param orderId
	 * @param actUserId
     * @return
     */
	public CheckInfo updOrderFinUserId(SysUser finUser, Long orderId, Long actUserId);

	/**
	 * 保存订单的风险测评等级和KYC答题的pdf链接
	 * @param orderId
     */
	public void createOrderKyc(long orderId);

	/**
	 * 查询在途订单数
	 * @param userId
	 * @return
	 */
	Long countInTransitOrder(Long userId);

	/**
	 *
	 * @param channel 渠道
	 * @param orgId 分公司
	 * @param hqlFilter
	 * @return
	 */
	public boolean getCustomFieldForOrderInfo(Integer channel, String orgId, HqlFilter hqlFilter);

	/**
	 * 通过渠道找分公司
	 * @param channelId
	 * @return
	 */
	public List<OrganizationFiled> getOrgList(String channelId);

	/**
	 * 获取用户渠道
	 * @param userId
	 * @return
	 */
	public List<UserChannel> getUserList(String userId);

}
